# 函数
# 定义函数
'''
def 函数名(参数1,参数2):
    函数体
    函数体
    函数体
    return 返回值
'''


# 计算a的平方
def pingFang(a):
    return a ** 2


print(pingFang(3))


# 函数式编程
# 函数作为参数
def func1(f):
    res = f(4)
    print(res)


func1(pingFang)


# 函数作为返回值
def func2():
    def func3():
        print("func3")
        return 1

    return func3


print(func2()())


# 参数类型
# 计算a的n次方
# a b : 位置参数（必选参数）
# n : 默认参数（可以不传）
def NciFang(a, b, n=2):
    return a ** n


print(NciFang(2, 1))
print(NciFang(3, 1))
print(NciFang(4, 1))


# 计算n个数之和
# *nums ：可变参数 可以接受任意多个参数
def sumN(*nums):
    sum = 0
    for num in nums:
        sum += num
    print(sum)


sumN(1)
sumN(1, 2)
sumN(1, 2, 3)
sumN(1, 2, 3, 4)


# 想要获取传入的参数的名字
# **args :关键字参数 相当于字典
def printParaName(**args):
    if "a" in args.keys():
        print("has a param")
    else:
        return
    for i, j in args.items():
        print(i, j)


printParaName(a=1, b=2, c=3)
printParaName(b=2, c=3)


# 命名关键字参数
# a, b, c 命名关键字参数 ：调用该函数时必须传入的参数，而且要通过 参数名=参数值 这种形式传入
# 定义的时候 funcName(*, a, b, c) 参数前加 “*,”
# 如果命名关键字参数前有可变参数 则 “*,”可以省略
def funcName(*nums, a, b, c):
    print(a, b, c)


funcName(a=1, b=2, c=3)

# 匿名函数
# lambda表达式
f4 = lambda a: a ** 3
func1(f4)
print(f4(3))
